package com.Shuang.ATM;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Account accountLogIn;  //存的是当前登录用户的账户
    Scanner sc = new Scanner(System.in);
    //ATM系统欢迎用户界面
    public void start(){
        while (true) {
            System.out.println("===欢迎使用ATM系统===");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择：");
            String command = sc.next();
            switch (command){
                case "1":
                    //用户登录操作
                    LogIn();
                    break;
                case "2":
                    //用户开户操作
                    creatAccount();
                    break;
                default:
                    System.out.println("选择的命令有误~请您重新输入~");
            }
        }
    }

    //用户开户：就是把Account的信息存进去
    private void creatAccount(){
        System.out.println("==用户开户系统==");
        Account account =  new Account();
        System.out.println("请您输入姓名：");
        String name = sc.next();
        account.setName(name);
        while (true) {
            System.out.println("请您输入性别：");
            char sex = sc.next().charAt(0); //取第一个位置的字符
            if(sex == '男'|| sex == '女'){
                account.setSex(sex);
                break;
            }else{
                System.out.println("输入的性别有误~请您重新输入~");
            }
        }
        while (true) {
            System.out.println("请您输入密码：");
            String password = sc.next();
            System.out.println("请您确认密码：");
            String okPassword = sc.next();
            if(okPassword.equals(password)){
                account.setPassword(okPassword);
                account.setCardID(creatCardID());
                break;
            }else{
                System.out.println("您确认的密码有误~请重新确认~");
            }
        }
        System.out.println("请您设置单次取现额度：");
        double list = sc.nextDouble();
        account.setList(list);

        //系统生成随机八位卡号存到账户中去
        String newCardId = creatCardID();
        account.setCardID(newCardId);

        //设置完信息将账户存到集合里去
        accounts.add(account);

        System.out.println("恭喜" + account.getName() + "开户成功~您的卡号是：" + account.getCardID());

    }
    //随机生成八位卡号，并且不能与账户中的卡号重复的实现，没重复才能用来当作新卡号使用
    private String creatCardID(){
        Random r = new Random();
        while (true) {
            String CardID = "";
            for (int i = 0; i < 8; i++) {
                int ID = r.nextInt(10); // 生成0-9的随机数
                CardID += ID;
            }
            //判断与之前账户中的卡号是否重复
            if(searchCardID(CardID) == null){
                return CardID;  //没重复返回卡号
            }
        }

    }

    //查询卡号是否存在，因为卡号是账户对象所以定义账户类型
    private Account searchCardID(String CardID) {
        for (int i = 0; i < accounts.size(); i++) {
            Account account = accounts.get(i);
            if (account.getCardID().equals(CardID)) {
                return account; //说明账户里已经有这个卡号了直接将账户返回
            }
        }
        return null;
    }

    //用户登录
    private void LogIn(){
        System.out.println("==用户登录系统==");
        //判断账户里有没有用户有的话才能登录，没有就退出
        if(accounts.size() == 0){
            System.out.println("对不起~系统没有账户，请先开户~");
            return;
        }
       String CardId = null;

        while (true) {
            System.out.println("请您输入卡号：");
            CardId = sc.next();
            Account account = searchCardID(CardId);
            if (account != null){
                while (true) {
                    System.out.println("请您输入密码：");
                    String password = sc.next();
                    if (account.getPassword().equals(password)){
                        System.out.println("恭喜" + account.getName() + "登陆成功~");
                        accountLogIn = account;  //登录成功后把当前登录的账户存起来，以便后续使用
                        //登陆后的操作
                        DisplayLogin();
                        return; //登陆操作结束跳出当前登陆方法回到欢迎页
                    }else{
                        System.out.println("您输入的密码有误~请重新输入喔~");
                    }
                }
            }else {
                System.out.println("您输入的卡号不存在~请重新输入~");
            }
        }

    }

    //登陆后的页面 命令展示和操作
    private void DisplayLogin(){
        System.out.println(accountLogIn + "您可以选择如下功能进行操作~");
        while (true) {
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、密码修改");
            System.out.println("6、退出当前账户");
            System.out.println("7、将当前账户注销");
            String command = sc.next();
            switch (command){
                case "1":
                    //查询账户
                    ShowLogInAccount();
                    break;
                case "2":
                    //存款
                    despositMoney();
                    break;
                case "3":
                    //取款
                    drawMonet();
                    break;
                case "4":
                    //转账
                    transferMoney();
                    break;
                case "5":
                    //密码修改
                    updatePassWord();
                    return; //密码修改成功返回欢迎页
                case "6":
                    //退出当前账户
                    System.out.println(accountLogIn.getName() + "您退出系统成功~");
                    return;  //跳出当前方法
                case "7":
                    //将当前账户销户
                    if(deleteAccount()){
                        return; //销户成功退出当前方法，返回到了欢迎界面
                    }else{
                        break;
                    }
                default:
                    System.out.println("对不起~您选择的命令有误，请您重新选择喔~");
            }
        }
    }

    //密码修改操作
    private void updatePassWord() {
        System.out.println("==密码修改操作==");
        while (true) {
            System.out.println("请您输入当前密码：");
            String PassWord = sc.next();
            if (accountLogIn.getPassword().equals(PassWord)){
                while (true) {
                    //证明当前登录密码输入正确
                    while (true) {
                        System.out.println("请您输入新密码：");
                        String newPassWord = sc.next();
                        if (accountLogIn.getPassword().equals(newPassWord)){
                            System.out.println("新密码与旧密码一致了~不允许修改，请重新设置");
                        }else{
                                System.out.println("请您确认新密码：");
                                String okPassWord = sc.next();
                                if (okPassWord.equals(newPassWord)){
                                    accountLogIn.setPassword(newPassWord);
                                    System.out.println("恭喜您密码修改成功，请重新登陆");
                                    return;
                                }
                                else{
                                    System.out.println("两次密码输入不一致，请重新设置新密码");
                                }
                        }
                    }
                }
            }else{
                System.out.println("您的密码输入有误~请重新输入~");
            }
        }
    }

    //销户操作，销户完成后返回到欢迎界面，没成功继续展示登录成功后功能页面，所以类型设置为boolean
    private boolean deleteAccount() {
        System.out.println("==销户操作==");
        while (true) {
            System.out.println("请问您是否真的要销户？ yes/no");
            String command = sc.next();
            switch (command){
                case "yes":
                    if (accountLogIn.getMoney() == 0){
                        //账户里没钱才允许销户
                        accounts.remove(accountLogIn);  //将当前登录的账户在集合里面移除
                        System.out.println("您的账户销户成功");
                        return true;
                    }else{
                        System.out.println("对不起~您的账户还有余额，不允许销户");
                        return false;
                    }
                case "no":
                    System.out.println("好的，您的账户保留成功~~");
                    return false;
                default:
                    System.out.println("您输入的命令有误~请您输入: yes/no");
                    break;
            }
        }
    }

    //转账
    private void transferMoney() {
        System.out.println("==转账操作==");
        //首先判断账户是否有两个及以上，没有的话提醒用户
        if(accounts.size() < 2){
            System.out.println("对不起~目前系统没有多余的账户，无法转账~");
            return;
        }
        //判断你自己的账户有没有钱，没有的话转不了
        if(accountLogIn.getMoney() == 0){
            System.out.println(accountLogIn.getName() + "您的账户余额为0,无法给他人转账喔~");
            return;
        }

        while (true) {
            //系统有足够的账户且自己账户有钱，可以开始转账了
            System.out.println("请您输入对方的卡号：");  //通过对方的卡号给别人转账
            String CardId = sc.next();
            Account OtherAccount = searchCardID(CardId);  //通过之前的查询卡号方法找到对方卡号是否存在
            if(OtherAccount == null){  //说明没找到对方卡号
                System.out.println("您输入的卡号有误~请重新输入喔~");
            }else{
                while (true) {
                    //说明找到对方的卡号了，但要进一步确认对方的姓名，确认成功才可以转账
                    System.out.println("请您输入对方的姓名：");
                    String name = sc.next();
                    //定义一个方法把之前加的姓名后面的先生或者女士去掉
                    String OtherName = gatName(OtherAccount);
                    if (name.equals(OtherName)){
                        //说明姓名是对方的姓名 可以开始转钱了
                        while (true) {
                            System.out.println("请您输入要转入对方账户的金额：");
                            double money = sc.nextDouble();
                            //再判断金额是否合理
                            if (money > accountLogIn.getMoney()){
                                //说明转入的金额超过了自己的余额无法转入
                                System.out.println("对不起~您的余额是" + accountLogIn.getMoney() +
                                        "不够转的呀，请您重新输入转入的金额");
                            }else{
                                //说明自己的钱够用，转账没有设置限额所以不用判断限额
                                accountLogIn.setMoney(accountLogIn.getMoney() - money);
                                OtherAccount.setMoney(OtherAccount.getMoney() + money);
                                System.out.println("恭喜您转账" + money + "成功~您的余额还有"
                                        + accountLogIn.getMoney());
                                return;  //转账结束，跳出方法
                            }
                        }
                    }else{
                        //不是对方的姓名就要接着输入姓名直到输入成功
                        System.out.println("对不起~您输入的姓名有误~请您重新输入");
                    }
                }
            }
        }
    }

    //定义一个方法用来把在账户对象得到姓名后面加的先生或者女士去掉,把账户放进来直接返回账户的姓名
    private String gatName(Account name) {
        //计算得到的姓名总长度
        int NameLength = name.getName().length();
        //返回从索引0开始到指定索引的字符 -> 就是把先生或者女士去掉
        return name.getName().substring(0, NameLength - 2);
    }

    //取钱
    private void drawMonet() {
        System.out.println("==取钱操作==");
        //先判断余额是否有一百元，不足一百元不让取...笑死
        if (accountLogIn.getMoney() < 100){
            System.out.println("对不起~" + accountLogIn.getName() + "您的余额为："
                    + accountLogIn.getMoney() + "不足一百元喔~我取不出来");
            return;
        }

        while (true) {
            System.out.println("请输入您要取走的金额：");
            double money = sc.nextDouble();
            //判断取的金额是否超过余额
            if (accountLogIn.getMoney() < money) {
                System.out.println("对不起您的余额为" + accountLogIn.getMoney() +
                        "不够您取的，请重新输入：");
            }else if (money <= accountLogIn.getList()){  //判断没超过限额可以取走
                accountLogIn.setMoney(accountLogIn.getMoney() - money);
                System.out.println("恭喜" + accountLogIn.getName() +
                        "取" + money +"钱成功~您的余额还有" + accountLogIn.getMoney());
                System.out.println("请问您是否还要继续取钱？");
                System.out.println("1、继续");
                System.out.println("2、返回功能页面");
                String command = sc.next();
                switch (command){
                    case "1":
                        //继续取钱
                        break;
                    case "2":
                        //退出取钱
                        return;
                }
            }else{//超过限额不让取
                System.out.println("对不起~您取钱的金额超过了单次限额" +
                        accountLogIn.getList() + "请重新取~");
            }
        }
    }

    //存钱
    private void despositMoney() {
        System.out.println("==存钱操作==");
        System.out.println("请输入您要存的金额");
        double money = sc.nextDouble();
        accountLogIn.setMoney(accountLogIn.getMoney() + money);
        System.out.println("恭喜您存" + money + "钱成功~您当前的余额为：" + accountLogIn.getMoney());
    }

    //查询账户信息展示出来
    private void ShowLogInAccount(){
        System.out.println(accountLogIn.getName() + "您当前账户的信息如下：");
        System.out.println("户主：" + gatName(accountLogIn));
        System.out.println("性别：" + accountLogIn.getSex());
        System.out.println("卡号：" + accountLogIn.getCardID());
        System.out.println("余额：" + accountLogIn.getMoney());
        System.out.println("单次取现额度：" + accountLogIn.getList());
    }
}
